/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica;

import sun.security.util.Length;

/**
 *
 * @author Chino
 */
public class Encriptador {
     double[][] cod = new double[][] { 
             {0, 1, 1, 2},
             {1, 4, 5, -1},
             {2, 4, 2, 5},
             {1, 3, 5, 2}
            };
        double[][] dec = new double[][]{
        {-(9.0/5.0), -(2.0/5.0), 2.0/5.0, 3.0/5.0}, 
        {24.0/35.0, 17.0/35.0, 3.0/35.0, -(23.0/35.0)}, 
        {-(1.0/7.0), -(1.0/7.0), -(1.0/7.0), 3.0/7.0}, 
        {8.0/35.0, -(6.0/35.0), 1.0/35.0,4.0/35.0}};
        int a = 2;
        public double[][] Encriptar(String mensaje){
            double[][] mensajeAscii= mensaje_ascii(mensaje);
            double[][] mensaje_encriptado = multiplicar_matrices(mensajeAscii,cod);
            return mensaje_encriptado;
        }
        public String Desencriptar(double[][] mensaje_encriptado) {
            double[][] matriz_desc = multiplicar_matrices(mensaje_encriptado, dec);
            int[] ascii =linealizar(matriz_desc);
            String mensaje = decodificar(ascii);
            return mensaje;
        }

        private double[][] mensaje_ascii(String mensaje) {
            char[] arreglo = mensaje.toCharArray();
            int columnas = arreglo.length / 4;
            if(arreglo.length % 4 > 0) {
                columnas++;
            }
            double[][] mensaje_ascii = new double[4][columnas];
            for(int i = 0;i < 4;i++){
                for(int c = 0;c < columnas;c++) {
                    if((i * columnas) + c ==arreglo.length ) {
                        i=4;
                        break;
                    }
                    mensaje_ascii[i][c] = (int)arreglo[(i * columnas) + c];
                }

            }            
            return mensaje_ascii;
        }

        private double[][] multiplicar_matrices(double[][] mensaje_ascii,double[][]tipo_cod) {
            
            double[][] mensaje_codificado= new double[4][mensaje_ascii[1].length];            
            for(int i = 0;i < 4;i++) {
                double suma = 0;
                for(int c = 0;c < mensaje_ascii[1].length;c++) {
                    suma = tipo_cod[i] [0] * mensaje_ascii[0] [c] + tipo_cod[i] [1] * mensaje_ascii[1] [c]
                        + tipo_cod[i] [2] * mensaje_ascii[2] [c] + tipo_cod[i] [3] * mensaje_ascii[3] [c];
                    mensaje_codificado[i] [c] = suma;                    
                }                
            }
            return mensaje_codificado;
        }

        public int[] linealizar(double[][] mensaje_codificado) {
            int columnas =mensaje_codificado[1].length;
            int[] mensaje_ascii = new int[4*columnas];
            for(int i = 0;i < 4;i++) {
                for(int c = 0;c < columnas;c++) {
                    mensaje_ascii[i * columnas + c] = (int)Math.round(mensaje_codificado[i][c]);
                }
            }
            return mensaje_ascii;
        }

        private String decodificar(int[] mensaje_ascii) {
            String mensaje="";
            for(int i=0; i<mensaje_ascii.length;i++){
                mensaje += Character.toString((char)mensaje_ascii[i]);
            }
            return mensaje;
        }
}
